#include <iostream>
#include <sw/redis++/redis++.h>
#include "util.hpp"

void test1(sw::redis::Redis &redis)
{
    std::cout << "get和set的使用" << std::endl;
    // 清空数据库，防止残留数据的干扰
    redis.flushall();

    redis.set("key1", "1");
    redis.set("key2", "2");
    redis.set("key3", "3");

    auto value1 = redis.get("key1");
    if (value1)
        std::cout << "value1 = " << value1.value() << std::endl;

    auto value2 = redis.get("key2");
    if (value2)
        std::cout << "value2 = " << value2.value() << std::endl;

    auto value3 = redis.get("key3");
    if (value3)
        std::cout << "value3 = " << value3.value() << std::endl;
    auto value4 = redis.get("key4");
    if (value4)
        std::cout << "value4 = " << value4.value() << std::endl;
}

void test2(sw::redis::Redis& redis)
{
    std::cout << "exists" << std::endl;
    redis.flushall();

    redis.set("key1", "1");
    redis.set("key2", "2");
    redis.set("key3", "3");

    auto ret = redis.exists("key1");
    std::cout << ret << std::endl;
    ret = redis.exists("key2");
    std::cout << ret << std::endl;
    ret = redis.exists("key4");
    std::cout << ret << std::endl;
    ret = redis.exists({"key1","key2","key3"});
    std::cout << ret << std::endl;
}

void test3(sw::redis::Redis& redis)
{
    std::cout << "del" << std::endl;
    redis.flushall();

    redis.set("key1", "1");
    redis.set("key2", "2");
    redis.set("key3", "3");

    auto ret = redis.del("key1");
    std::cout << ret << std::endl;
    ret = redis.exists("key1");
    std::cout << ret << std::endl;
    ret = redis.del({"key2","key3"});
    std::cout << ret << std::endl;
    ret = redis.exists("key2");
    std::cout << ret << std::endl;
}

void test4(sw::redis::Redis& redis)
{
    std::cout << "keys" << std::endl;
    redis.flushall();

    redis.set("key1", "1");
    redis.set("key2", "2");
    redis.set("key3", "3");

    // keys 的第二个参数, 是一个 "插入迭代器". 咱们需要先准备好一个保存结果的容器. 
    // 接下来再创建一个插入迭代器指向容器的位置. 就可以把 keys 获取到的结果依次通过刚才的插入迭代器插入到容器的指定位置中了. 
    std::vector<std::string> result;
    auto it = std::back_inserter(result);
    redis.keys("*",it);
    PrintContainer(result);
}


void test5(sw::redis::Redis& redis)
{
    using namespace std::chrono_literals;

    std::cout << "expire and ttl" << std::endl;
    redis.flushall();

    //redis.set("key1", "1", 10s);
    redis.set("key1","1");
    redis.expire("key1",10s);

    std::this_thread::sleep_for(3s);
    auto time = redis.ttl("key1");
    std::cout << time << std::endl;
}

void test6(sw::redis::Redis& redis)
{
    std::cout << "type" << std::endl;
    redis.flushall();

    redis.set("key1", "1");
    auto result = redis.type("key1");
    std::cout << "key1: " << result << std::endl;

    redis.lpush("key2", "111");
    result = redis.type("key2");
    std::cout << "key2: " << result << std::endl;

    redis.hset("key3", "aaa", "111");
    result = redis.type("key3");
    std::cout << "key3: " << result << std::endl;

    redis.sadd("key4", "aaa");
    result = redis.type("key4");
    std::cout << "key4: " << result << std::endl;

    redis.zadd("key5", "吕布", 99);
    result = redis.type("key5");
    std::cout << "key5: " << result << std::endl;
}


int main()
{
    sw::redis::Redis redis("redis://127.0.0.1:6379");
    //test1(redis);
    //test2(redis);
    //test3(redis);
    //test4(redis);
    //test5(redis);
    test6(redis);
}